home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 19
/
Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso
/
Aminet
/
util
/
cli
/
Randomizer.lha
/
Randomizer.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-04-05
|
3KB
|
133 lines
/*
* Random Numbers
* For use with any ANSI C-Compiler
* Tested with Maxon C/C++ 4.0
*/
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#include <pragma/intuition_lib.h>
#include <clib/macros.h>
#include <stdlib.h>
struct Library *IntuitionBase = NULL;
LONG args[2] = {0, 0};
STRPTR tmplate = "HI=HIGH/K/N,LO=LOW/K/N\n";
LONG int2asc(char *c, LONG n, LONG b);
// retval = int2asc(targetstring, number to convert, numbers base);
// retval: Numbers base for success, 0 if base not supported
// targetstring: String with enough space to hold the ascii-ized number
// num. to convert: POSITIVE number only, if negative will be switched to positive !!!
// numbers base: Base to which the number will be converted, currently only
// binary (2), octal (8) and decimal (10) support
void main(void)
{
struct RDArgs *rdargs;
ULONG secs, mics;
LONG low = 0, high = 1, random, *num;
int rw = RETURN_FAIL;
char numbuf[8];
IntuitionBase = OpenLibrary("intuition.library", 37);
if(IntuitionBase)
{
rw = RETURN_ERROR;
rdargs = ReadArgs(tmplate, args, NULL);
if(rdargs)
{
rw = RETURN_OK;
num = (LONG *) args[0];
if(num)
{
high = *num;
}
num = (LONG *) args[1];
if(num)
{
low = *num;
}
FreeArgs(rdargs);
}
CurrentTime(&secs, &mics); // Intuition interface to timer/GetSysTime
secs %= (high + 1); // Mask out anything above "high"
random = MAX(secs, low); // Make sure, value is at least "low"
// No need to test the return value for base 10 here
int2asc(numbuf, random, 10);
// Create a dos shell variable named RANDOM
if(SetVar("RANDOM", numbuf, -1, LV_VAR) == DOSFALSE)
{
rw = RETURN_ERROR;
}
CloseLibrary(IntuitionBase);
}
exit(rw);
}
// Here is the interesting part
LONG int2asc(char *c, LONG n, LONG b)
{
char zahl[32]; // Widest range is binary: uses 32 chars, one for each bit
LONG tmp, rw, i = 0;
n = ABS(n); // Get rid of a possibly signed value
switch(b)
{
case 16:
rw = 0; // Not yet supported, but easy to implement. I don't need it here.
break;
case 10: // Anything equal to or below base 10 has the same handling
case 8:
case 2:
// Generate ascii-ized string, is written REVERSED into the buffer !!!
do
{
tmp = (n % b);
tmp += 48; // Promote the remainder to it's ascii equivalent
zahl[i] = tmp;
i++;
n /= b;
}
while(n);
c[i] = 0; // Set the terminating null-byte
i--; // Adjust the counter
while(i >= 0) // Reverse copy the number to the string
{
*c = zahl[i];
c++;
i--;
}
rw = b; // return "ok"
break;
default:
rw = 0; // return "not yet implemented"
break;
}
return(rw);
}